Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore(j-s): Send notifications when subpoena changes #16329

Merged
merged 51 commits into from
Oct 18, 2024

Conversation

oddsson
Copy link
Member

@oddsson oddsson commented Oct 9, 2024

Send notifications when subpoena changes

Asana

What

Send email notifications to judges and registrars when

  • Service is successful
  • Service failed
  • Defendant selected defender

Why

This is useful info for court users.

Checklist:

  • I have performed a self-review of my own code
  • I have made corresponding changes to the documentation
  • My changes generate no new warnings
  • I have added tests that prove my fix is effective or that my feature works
  • Formatting passes locally with my changes
  • I have rebased against main before asking for a review

Summary by CodeRabbit

  • New Features

    • Introduced a new notification system with enhanced capabilities for handling subpoenas.
    • Added support for different notification types and improved handling of prosecutor office identifiers.
    • Added a new SubpoenaNotificationService for managing subpoena notifications.
    • New classes for notification bodies and subpoena notifications have been implemented.
    • Updated the NotificationModule to include the SubpoenaNotificationService.
    • Enhanced notification methods to manage service status checks effectively.
  • Bug Fixes

    • Updated method signatures to allow for optional parameters, enhancing flexibility in notification handling.
  • Documentation

    • Updated API tags for clarity regarding limited access subpoenas.

Copy link

codecov bot commented Oct 14, 2024

Codecov Report

Attention: Patch coverage is 43.65079% with 71 lines in your changes missing coverage. Please review.

Project coverage is 36.78%. Comparing base (af0f4ca) to head (1c7be80).
Report is 1 commits behind head on main.

Files with missing lines Patch % Lines
...dules/notification/subpoenaNotification.service.ts 23.52% 52 Missing ⚠️
...ckend/src/app/modules/subpoena/subpoena.service.ts 21.42% 11 Missing ⚠️
...es/notification/internalNotification.controller.ts 77.77% 2 Missing ⚠️
...rc/app/modules/notification/notification.module.ts 0.00% 2 Missing ⚠️
...ackend/src/app/modules/subpoena/subpoena.module.ts 0.00% 2 Missing ⚠️
...es/notification/institutionNotification.service.ts 75.00% 1 Missing ⚠️
libs/judicial-system/types/src/lib/defendant.ts 50.00% 1 Missing ⚠️
Additional details and impacted files

Impacted file tree graph

@@           Coverage Diff            @@
##             main   #16329    +/-   ##
========================================
  Coverage   36.78%   36.78%            
========================================
  Files        6833     6836     +3     
  Lines      141446   141559   +113     
  Branches    40280    40319    +39     
========================================
+ Hits        52029    52075    +46     
- Misses      89417    89484    +67     
Flag Coverage Δ
api 3.37% <ø> (ø)
application-system-api 41.36% <ø> (ø)
application-template-api-modules 27.84% <ø> (-0.03%) ⬇️
application-templates-parental-leave 29.96% <ø> (ø)
application-ui-shell 21.37% <ø> (ø)
judicial-system-api 18.49% <83.33%> (+0.11%) ⬆️
judicial-system-backend 55.19% <43.65%> (-0.11%) ⬇️
judicial-system-formatters 79.27% <83.33%> (+0.02%) ⬆️
judicial-system-message 67.31% <100.00%> (+0.06%) ⬆️
judicial-system-message-handler 48.44% <100.00%> (+0.08%) ⬆️
judicial-system-scheduler 69.64% <85.71%> (+0.09%) ⬆️
judicial-system-types 46.65% <0.00%> (-0.48%) ⬇️
judicial-system-web 27.91% <50.00%> (+<0.01%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
...p/modules/notification/baseNotification.service.ts 78.94% <100.00%> (+4.47%) ⬆️
...dules/notification/dto/subpoenaNotification.dto.ts 100.00% <100.00%> (ø)
...dules/notification/internalNotification.service.ts 80.81% <ø> (-0.23%) ⬇️
...dules/notification/subpoenaNotification.strings.ts 100.00% <100.00%> (ø)
...dules/subpoena/limitedAccessSubpoena.controller.ts 100.00% <ø> (ø)
...dules/subpoena/test/createTestingSubpoenaModule.ts 100.00% <100.00%> (ø)
libs/judicial-system/message/src/lib/message.ts 100.00% <100.00%> (ø)
libs/judicial-system/types/src/index.ts 100.00% <100.00%> (ø)
libs/judicial-system/types/src/lib/notification.ts 100.00% <100.00%> (ø)
...es/notification/institutionNotification.service.ts 89.13% <75.00%> (-1.78%) ⬇️
... and 6 more

... and 1 file with indirect coverage changes


Continue to review full report in Codecov by Sentry.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update af0f4ca...1c7be80. Read the comment docs.

@datadog-island-is
Copy link

datadog-island-is bot commented Oct 14, 2024

Datadog Report

All test runs 81b677e 🔗

72 Total Test Services: 1 Failed, 68 Passed
🔻 Test Sessions change in coverage: 3 decreased, 4 increased, 193 no change

Test Services
This report shows up to 10 services
Service Name Failed Known Flaky New Flaky Passed Skipped Total Time Code Coverage Change Test Service View
judicial-system-backend 3 0 0 21110 0 21m 37.03s 1 decreased (-0.37%) Link
air-discount-scheme-backend 0 0 0 81 0 33.18s 1 no change Link
air-discount-scheme-web 0 0 0 2 0 8.06s 1 no change Link
api 0 0 0 4 0 2.81s N/A Link
api-domains-air-discount-scheme 0 0 0 6 0 18.59s 1 no change Link
api-domains-assets 0 0 0 3 0 11.64s 1 no change Link
api-domains-auth-admin 0 0 0 18 0 13.97s N/A Link
api-domains-communications 0 0 0 5 0 32.82s N/A Link
api-domains-criminal-record 0 0 0 5 0 9.8s 1 no change Link
api-domains-driving-license 0 0 0 23 0 36.67s 1 no change Link

❌ Failed Tests (3)

  • InternalSubpoenaController - Deliver subpoena to police subpoena delivered to police should call deliverSubpoenaToPolice - apps/judicial-system/backend/src/app/modules/subpoena/test/internalSubpoenaController/deliverSubpoenaToPolice.spec.ts - Details

    Expand for error
     Nest can't resolve dependencies of the SubpoenaService (Sequelize, SubpoenaRepository, DefendantRepository, PdfService, ?, PoliceService, FileService, Logger). Please make sure that the argument MessageService at index [4] is available in the RootTestModule context.
     
     Potential solutions:
     - Is RootTestModule a valid NestJS module?
     - If MessageService is a provider, is it part of the current RootTestModule?
     - If MessageService is exported from a separate @Module, is that module imported within RootTestModule?
       @Module({
         imports: [ /* the Module containing MessageService */ ]
       })
     
    
  • LimitedAccessSubpoenaController - Get subpoena pdf pdf generated should generate pdf - apps/judicial-system/backend/src/app/modules/subpoena/test/limitedAccessSubpoenaController/getSubpoenaPdf.spec.ts - Details

    Expand for error
     Nest can't resolve dependencies of the SubpoenaService (Sequelize, SubpoenaRepository, DefendantRepository, PdfService, ?, PoliceService, FileService, Logger). Please make sure that the argument MessageService at index [4] is available in the RootTestModule context.
     
     Potential solutions:
     - Is RootTestModule a valid NestJS module?
     - If MessageService is a provider, is it part of the current RootTestModule?
     - If MessageService is exported from a separate @Module, is that module imported within RootTestModule?
       @Module({
         imports: [ /* the Module containing MessageService */ ]
       })
     
    
  • SubpoenaController - Get subpoena pdf pdf generated should generate pdf - apps/judicial-system/backend/src/app/modules/subpoena/test/subpoenaController/getSubpoenaPdf.spec.ts - Details

    Expand for error
     Nest can't resolve dependencies of the SubpoenaService (Sequelize, SubpoenaRepository, DefendantRepository, PdfService, ?, PoliceService, FileService, Logger). Please make sure that the argument MessageService at index [4] is available in the RootTestModule context.
     
     Potential solutions:
     - Is RootTestModule a valid NestJS module?
     - If MessageService is a provider, is it part of the current RootTestModule?
     - If MessageService is exported from a separate @Module, is that module imported within RootTestModule?
       @Module({
         imports: [ /* the Module containing MessageService */ ]
       })
     
    

🔻 Code Coverage Decreases vs Default Branch (3)

  • judicial-system-backend - jest 58.24% (-0.37%) - Details
  • judicial-system-types - jest 50.45% (-0.28%) - Details
  • license-api - jest 33.92% (-0.02%) - Details

@oddsson oddsson marked this pull request as ready for review October 14, 2024 15:15
@oddsson oddsson requested a review from a team as a code owner October 14, 2024 15:15
Copy link
Contributor

coderabbitai bot commented Oct 14, 2024

Walkthrough

The changes in this pull request introduce the SubpoenaNotificationDto and NotificationBodyDto classes, along with various property additions. The InstitutionNotificationDto class has been removed. Method signatures in the notification service and controller have been updated to accommodate new optional parameters. A new service, SubpoenaNotificationService, has been added with relevant methods. Additionally, module imports and decorators have been modified to reflect these updates.

Changes

File Path Change Summary
.../notification/dto/institutionNotification.dto.ts Class removed: InstitutionNotificationDto
.../notification/dto/notificationBody.dto.ts New properties added: readonly type, readonly prosecutorsOfficeId?, readonly subpoenaId?
.../notification/dto/subpoenaNotification.dto.ts New class added: SubpoenaNotificationDto with properties readonly type, readonly subpoena
.../notification/institutionNotification.service.ts Method signatures updated to make prosecutorsOfficeId optional in two methods.
.../notification/internalNotification.controller.ts Method signatures updated to use NotificationBodyDto and added new method sendSubpoenaNotification.
.../notification/notification.module.ts NotificationModule now imports SubpoenaModule and includes SubpoenaNotificationService in providers.
.../notification/subpoenaNotification.service.ts Class added: SubpoenaNotificationService with method async sendNotification(type, subpoena).
.../subpoena/limitedAccessSubpoena.controller.ts Decorator updated from @ApiTags('limited access defendants') to @ApiTags('limited access subpoenas').
.../subpoena/subpoena.service.ts Method signatures updated and new private methods added to check service status.
.../migrations/20241015105921-update-notification.js Methods added: up(queryInterface) and down(queryInterface).
.../message/src/lib/message.ts Enum value added: SUBPOENA_NOTIFICATION in MessageType.
.../types/src/index.ts Method added: isFailedServiceStatus in ./lib/defendant.
.../types/src/lib/defendant.ts Method added: export const isFailedServiceStatus = (status?: ServiceStatus): boolean.

Possibly related PRs

Suggested reviewers

  • unakb

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@oddsson oddsson changed the title fix(j-s)/notifications defendant selected defender chore(j-s): Send notifications when subpoena changes Oct 14, 2024
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

🧹 Outside diff range and nitpick comments (12)
apps/judicial-system/backend/src/app/modules/notification/dto/notificationBody.dto.ts (1)

18-21: LGTM: subpoenaId property is well-defined as an optional UUID.

The subpoenaId property is correctly implemented, mirroring the structure of prosecutorsOfficeId:

  • Appropriate type (optional string)
  • Proper validation using @IsOptional() and @IsUUID()
  • Swagger documentation using @ApiPropertyOptional()

This ensures consistency in handling optional UUID fields.

Consider creating a custom decorator to encapsulate this common pattern of optional UUID fields, adhering to the DRY (Don't Repeat Yourself) principle. For example:

function OptionalUUID() {
  return applyDecorators(
    IsOptional(),
    IsUUID(),
    ApiPropertyOptional({ type: String })
  );
}

// Usage:
@OptionalUUID()
readonly subpoenaId?: string;

This would make the code more maintainable and reduce the likelihood of inconsistencies in future additions.

apps/judicial-system/backend/src/app/modules/subpoena/subpoena.module.ts (2)

21-21: MessageModule added to imports with forwardRef

The MessageModule has been added to the imports array using forwardRef. This approach is correct when dealing with circular dependencies between modules.

While this solves the immediate issue of circular dependencies, it's worth considering if this circular dependency is necessary or if it could be refactored to have a more linear dependency graph. This could improve the overall architecture and make the system easier to maintain and understand in the long run.


Line range hint 1-33: Overall module structure remains consistent

The changes to this module (adding MessageModule) have been implemented without disrupting the existing structure. The module continues to follow NestJS best practices for module definition, including proper use of decorators, imports, controllers, providers, and exports.

Consider adding a brief comment explaining the purpose of the MessageModule in this context, especially if it's not immediately obvious why it's needed in the Subpoena module. This would improve code readability and maintainability.

apps/judicial-system/backend/src/app/modules/notification/notification.module.ts (1)

36-36: LGTM: Module configuration updated correctly.

The addition of SubpoenaModule to imports and SubpoenaNotificationService to providers is correct and consistent with the new functionality. The use of forwardRef for SubpoenaModule appropriately handles potential circular dependencies.

Consider adding a comment explaining the reason for using forwardRef with SubpoenaModule to improve code maintainability.

Also applies to: 49-49

apps/judicial-system/backend/src/app/modules/subpoena/limitedAccessSubpoena.controller.ts (2)

51-51: Approved: API tag update improves accuracy

The change from 'limited access defendants' to 'limited access subpoenas' in the @ApiTags decorator accurately reflects the controller's focus on subpoenas. This update enhances the clarity of the API documentation.

Consider using a constant for the tag value to ensure consistency across the codebase:

const API_TAGS = {
  LIMITED_ACCESS_SUBPOENAS: 'limited access subpoenas',
  // ... other tags
};

@ApiTags(API_TAGS.LIMITED_ACCESS_SUBPOENAS)

This approach would make it easier to maintain and update API tags consistently throughout the application.


Line range hint 1-89: Overall structure and implementation review

The LimitedAccessSubpoenaController demonstrates good adherence to NestJS and TypeScript best practices:

  1. Proper use of decorators for routing, guards, and API documentation.
  2. Effective use of dependency injection for services.
  3. Strong typing with TypeScript throughout the controller.
  4. Clear separation of concerns with focused functionality for subpoena retrieval.

Consider the following suggestions to further improve the code:

  1. Error Handling: Implement global exception filters or add try-catch blocks to handle potential errors gracefully.
  2. Logging: Enhance logging to cover both successful operations and potential errors for better observability.
  3. Input Validation: Consider adding DTO (Data Transfer Object) classes with class-validator decorators for robust input validation.

Example of enhanced error handling and logging:

@Get()
async getSubpoenaPdf(
  // ... existing parameters
): Promise<void> {
  try {
    this.logger.debug(`Getting subpoena ${subpoenaId} for defendant ${defendantId} of case ${caseId}`)
    
    const pdf = await this.pdfService.getSubpoenaPdf(theCase, defendant, subpoena)
    
    res.end(pdf)
    
    this.logger.info(`Successfully retrieved subpoena ${subpoenaId}`)
  } catch (error) {
    this.logger.error(`Error retrieving subpoena ${subpoenaId}: ${error.message}`)
    throw new InternalServerErrorException('Failed to retrieve subpoena')
  }
}

These enhancements would improve the robustness and maintainability of the controller.

apps/judicial-system/backend/src/app/modules/notification/subpoenaNotification.strings.ts (2)

3-43: Overall structure is good, but some descriptions need updating.

The strings object is well-structured, and the use of defineMessage for internationalization is correct. However, some descriptions need to be updated to accurately reflect the content of the messages:

  1. For serviceFailedSubject, serviceFailedBody, defendantSelectedDefenderSubject, and defendantSelectedDefenderBody, the descriptions incorrectly state "when the serive status in an indictment has changed". These should be updated to reflect the specific scenarios they represent.

  2. There's a typo in the word "serive" in all descriptions. It should be "service".

Consider updating the descriptions to accurately reflect each message's purpose. For example:

defendantSelectedDefenderSubject: defineMessage({
  id: 'judicial.system.backend:subpoena_notifications.defendant_selected_defender_subject',
  defaultMessage: 'Val á verjanda í máli {courtCaseNumber}',
  description: 'Subject of the notification sent when a defendant has selected a defender',
}),

1-43: Internationalization practices are well-implemented.

The use of defineMessage and placeholders is consistent with best practices for internationalization. The id values are descriptive and follow a good hierarchical structure.

Note that some messages contain HTML tags (e.g., <br /> and {linkStart}...{linkEnd}). Ensure that the component rendering these messages can properly handle HTML content. Consider adding a comment in the file to remind developers about this requirement:

// Note: Some messages contain HTML tags. Ensure proper rendering in the UI components.
apps/judicial-system/backend/src/app/modules/notification/institutionNotification.service.ts (1)

49-54: LGTM with a minor suggestion for clarity

The changes to make prosecutorsOfficeId optional and add a conditional check are good improvements. They enhance the flexibility of the method while maintaining type safety.

Consider adding a comment explaining why we return early when prosecutorsOfficeId is not provided. This would improve code readability. For example:

if (!prosecutorsOfficeId) {
  // Early return if no prosecutorsOfficeId is provided, as it's required for further processing
  return
}
apps/judicial-system/backend/src/app/modules/subpoena/subpoena.service.ts (3)

55-68: Add Explicit Return Types to Methods for Better Type Safety

Adding explicit return types to the isSuccessfulServiceStatus and isFailedServiceStatus methods enhances readability and type safety.

Apply the following changes:

-private isSuccessfulServiceStatus(serviceStatus?: ServiceStatus) {
+private isSuccessfulServiceStatus(serviceStatus?: ServiceStatus): boolean {
   return (
     serviceStatus &&
     [
       ServiceStatus.ELECTRONICALLY,
       ServiceStatus.DEFENDER,
       ServiceStatus.IN_PERSON,
     ].includes(serviceStatus)
   )
 }

-private isFailedServiceStatus(serviceStatus?: ServiceStatus) {
+private isFailedServiceStatus(serviceStatus?: ServiceStatus): boolean {
   return serviceStatus && serviceStatus === ServiceStatus.FAILED
 }

156-174: Consider Awaiting the sendMessagesToQueue Call

Since sendMessagesToQueue returns a promise, consider using await to ensure proper error handling and that the message dispatch completes before proceeding.

Apply the following change:

-          this.messageService
+          await this.messageService
             .sendMessagesToQueue([
               {
                 type: MessageType.NOTIFICATION,
                 body: {
                   type: notificationType,
                   subpoenaId: subpoena.subpoenaId,
                 },
               },
             ])

If the intention is to fire-and-forget, explicitly indicate this:

-          this.messageService
+          void this.messageService
             .sendMessagesToQueue([
               // ...
             ])

55-68: Add Unit Tests for New Helper Methods

Include unit tests for isSuccessfulServiceStatus and isFailedServiceStatus to ensure they handle all ServiceStatus cases correctly.

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between 3e13aff and 4f5ca7a.

📒 Files selected for processing (11)
  • apps/judicial-system/backend/src/app/modules/notification/dto/institutionNotification.dto.ts (0 hunks)
  • apps/judicial-system/backend/src/app/modules/notification/dto/notificationBody.dto.ts (1 hunks)
  • apps/judicial-system/backend/src/app/modules/notification/institutionNotification.service.ts (2 hunks)
  • apps/judicial-system/backend/src/app/modules/notification/internalNotification.controller.ts (4 hunks)
  • apps/judicial-system/backend/src/app/modules/notification/notification.module.ts (4 hunks)
  • apps/judicial-system/backend/src/app/modules/notification/subpoenaNotification.service.ts (1 hunks)
  • apps/judicial-system/backend/src/app/modules/notification/subpoenaNotification.strings.ts (1 hunks)
  • apps/judicial-system/backend/src/app/modules/subpoena/limitedAccessSubpoena.controller.ts (1 hunks)
  • apps/judicial-system/backend/src/app/modules/subpoena/subpoena.module.ts (2 hunks)
  • apps/judicial-system/backend/src/app/modules/subpoena/subpoena.service.ts (4 hunks)
  • libs/judicial-system/types/src/lib/notification.ts (1 hunks)
💤 Files with no reviewable changes (1)
  • apps/judicial-system/backend/src/app/modules/notification/dto/institutionNotification.dto.ts
🧰 Additional context used
📓 Path-based instructions (10)
apps/judicial-system/backend/src/app/modules/notification/dto/notificationBody.dto.ts (1)

Pattern apps/**/*: "Confirm that the code adheres to the following:

  • NextJS best practices, including file structure, API routes, and static generation methods.
  • Efficient state management and server-side rendering techniques.
  • Optimal use of TypeScript for component and utility type safety."
apps/judicial-system/backend/src/app/modules/notification/institutionNotification.service.ts (1)

Pattern apps/**/*: "Confirm that the code adheres to the following:

  • NextJS best practices, including file structure, API routes, and static generation methods.
  • Efficient state management and server-side rendering techniques.
  • Optimal use of TypeScript for component and utility type safety."
apps/judicial-system/backend/src/app/modules/notification/internalNotification.controller.ts (1)

Pattern apps/**/*: "Confirm that the code adheres to the following:

  • NextJS best practices, including file structure, API routes, and static generation methods.
  • Efficient state management and server-side rendering techniques.
  • Optimal use of TypeScript for component and utility type safety."
apps/judicial-system/backend/src/app/modules/notification/notification.module.ts (1)

Pattern apps/**/*: "Confirm that the code adheres to the following:

  • NextJS best practices, including file structure, API routes, and static generation methods.
  • Efficient state management and server-side rendering techniques.
  • Optimal use of TypeScript for component and utility type safety."
apps/judicial-system/backend/src/app/modules/notification/subpoenaNotification.service.ts (1)

Pattern apps/**/*: "Confirm that the code adheres to the following:

  • NextJS best practices, including file structure, API routes, and static generation methods.
  • Efficient state management and server-side rendering techniques.
  • Optimal use of TypeScript for component and utility type safety."
apps/judicial-system/backend/src/app/modules/notification/subpoenaNotification.strings.ts (1)

Pattern apps/**/*: "Confirm that the code adheres to the following:

  • NextJS best practices, including file structure, API routes, and static generation methods.
  • Efficient state management and server-side rendering techniques.
  • Optimal use of TypeScript for component and utility type safety."
apps/judicial-system/backend/src/app/modules/subpoena/limitedAccessSubpoena.controller.ts (1)

Pattern apps/**/*: "Confirm that the code adheres to the following:

  • NextJS best practices, including file structure, API routes, and static generation methods.
  • Efficient state management and server-side rendering techniques.
  • Optimal use of TypeScript for component and utility type safety."
apps/judicial-system/backend/src/app/modules/subpoena/subpoena.module.ts (1)

Pattern apps/**/*: "Confirm that the code adheres to the following:

  • NextJS best practices, including file structure, API routes, and static generation methods.
  • Efficient state management and server-side rendering techniques.
  • Optimal use of TypeScript for component and utility type safety."
apps/judicial-system/backend/src/app/modules/subpoena/subpoena.service.ts (1)

Pattern apps/**/*: "Confirm that the code adheres to the following:

  • NextJS best practices, including file structure, API routes, and static generation methods.
  • Efficient state management and server-side rendering techniques.
  • Optimal use of TypeScript for component and utility type safety."
libs/judicial-system/types/src/lib/notification.ts (1)

Pattern libs/**/*: "Confirm that the code adheres to the following:

  • Reusability of components and hooks across different NextJS apps.
  • TypeScript usage for defining props and exporting types.
  • Effective tree-shaking and bundling practices."
🔇 Additional comments (21)
apps/judicial-system/backend/src/app/modules/notification/dto/notificationBody.dto.ts (5)

1-5: LGTM: Imports are well-organized and follow best practices.

The imports are correctly structured, importing only the necessary decorators and types. The use of a custom type import (NotificationType) suggests good modularization of the codebase.


7-7: LGTM: Class declaration follows DTO naming convention.

The NotificationBodyDto class is correctly named and exported, following the Data Transfer Object (DTO) pattern and allowing its use throughout the application.


8-11: LGTM: type property is well-defined and properly validated.

The type property is correctly implemented with:

  • Appropriate type (NotificationType)
  • Proper validation using @IsNotEmpty() and @IsEnum()
  • Swagger documentation using @ApiProperty()

This ensures type safety, enforces data integrity, and provides clear API documentation.


13-16: LGTM: prosecutorsOfficeId property is well-defined as an optional UUID.

The prosecutorsOfficeId property is correctly implemented with:

  • Appropriate type (optional string)
  • Proper validation using @IsOptional() and @IsUUID()
  • Swagger documentation using @ApiPropertyOptional()

This allows for flexibility in the DTO while ensuring that when provided, the value is a valid UUID.


1-22: Overall, excellent implementation of the NotificationBodyDto.

This DTO is well-structured and follows TypeScript and NestJS best practices:

  • Proper use of decorators for validation and API documentation
  • Clear type definitions and appropriate use of optionals
  • Adherence to naming conventions and modular design principles

The implementation aligns well with the coding guidelines, particularly in terms of TypeScript usage for type safety and efficient state management. It provides a solid foundation for handling notification-related data in the judicial system application.

libs/judicial-system/types/src/lib/notification.ts (1)

21-23: LGTM! The new enum members are well-defined and consistent.

The additions to the NotificationType enum are appropriate and follow the existing naming conventions. They enhance the notification system's functionality and adhere to the coding guidelines for the libs directory:

  1. The new types improve reusability across different NextJS apps by providing more specific notification scenarios.
  2. The enum is properly exported, aligning with TypeScript usage for defining and exporting types.
  3. These additions support effective tree-shaking and bundling practices by keeping related types together in a single enum.
apps/judicial-system/backend/src/app/modules/subpoena/subpoena.module.ts (1)

4-5: New import added for MessageModule

The addition of the MessageModule import from '@island.is/judicial-system/message' suggests that messaging functionality is being integrated into the Subpoena module. This change appears to be in line with modular design principles.

To ensure this import is used correctly throughout the module, let's verify its usage:

✅ Verification successful

MessageModule is properly imported and utilized

MessageModule is correctly imported and used in the SubpoenaModule. The usage in forwardRef ensures proper handling of potential circular dependencies.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check for usage of MessageModule in the subpoena module

# Test: Search for MessageModule usage in the subpoena module
rg --type typescript 'MessageModule' apps/judicial-system/backend/src/app/modules/subpoena

Length of output: 125


Script:

#!/bin/bash
# Description: Check for usage of MessageModule in the subpoena module using file extensions

# Test: Search for MessageModule usage in TypeScript files within the subpoena module
rg 'MessageModule' --glob '*.ts' --glob '*.tsx' apps/judicial-system/backend/src/app/modules/subpoena

Length of output: 351

apps/judicial-system/backend/src/app/modules/notification/notification.module.ts (3)

16-16: LGTM: Import statement addition is correct.

The addition of SubpoenaModule to the imports is consistent with the module's new functionality and follows the established naming and import conventions.


26-26: LGTM: SubpoenaNotificationService import added correctly.

The import of SubpoenaNotificationService is consistent with the module's new functionality and follows the established naming and import conventions.


Line range hint 1-53: Overall, the changes look good and are well-implemented.

The modifications to the NotificationModule are consistent with the PR objectives and follow best practices for Nest.js and TypeScript. The integration of the new SubpoenaModule and SubpoenaNotificationService is done correctly, maintaining the module's structure and dependency management.

apps/judicial-system/backend/src/app/modules/notification/subpoenaNotification.strings.ts (2)

1-1: LGTM: Import statement is correct.

The import of defineMessage from '@formatjs/intl' is appropriate for internationalization purposes.


1-43: LGTM: File is well-structured and follows internationalization best practices.

Overall, this file is well-implemented and follows good practices for internationalization. The suggested improvements are minor:

  1. Update some message descriptions for accuracy.
  2. Add a note about HTML content in messages.

These changes will enhance maintainability but don't affect functionality. The file is approved for merging.

apps/judicial-system/backend/src/app/modules/notification/institutionNotification.service.ts (2)

94-94: LGTM: Changes are consistent and maintain type safety

The modification to make prosecutorsOfficeId optional in the sendNotification method signature is consistent with the changes in sendIndictmentsWaitingForConfirmationNotification. This change maintains type safety while allowing for more flexible usage of the method.


Line range hint 1-118: Overall assessment: Changes improve flexibility while maintaining best practices

The modifications to the InstitutionNotificationService class enhance its flexibility by making the prosecutorsOfficeId parameter optional in both sendIndictmentsWaitingForConfirmationNotification and sendNotification methods. These changes:

  1. Adhere to NextJS best practices and maintain the existing file structure.
  2. Improve TypeScript type safety by properly handling the optional parameter.
  3. Don't introduce any issues with state management or server-side rendering.

The code changes are consistent throughout the file and align well with the provided coding guidelines for the apps/**/* pattern.

apps/judicial-system/backend/src/app/modules/notification/internalNotification.controller.ts (5)

22-22: Importing NotificationBodyDto

The import statement correctly brings in the new NotificationBodyDto class, ensuring that the updated DTO is used in the controller methods.


27-27: Importing SubpoenaNotificationService

The SubpoenaNotificationService is appropriately imported, which is necessary for handling subpoena notifications within the controller.


37-37: Injecting SubpoenaNotificationService into the controller

The SubpoenaNotificationService is correctly injected into the InternalNotificationController constructor, allowing it to be utilized in the sendNotification method.


69-69: Updating parameter type to NotificationBodyDto in sendNotification method

The sendNotification method now correctly uses NotificationBodyDto as its parameter type, reflecting the updated structure of the notification data.


90-90: Updating parameter type to NotificationBodyDto in dispatchNotification method

The dispatchNotification method has been updated to accept NotificationBodyDto, ensuring consistency in the DTOs used across the controller.

apps/judicial-system/backend/src/app/modules/subpoena/subpoena.service.ts (2)

47-47: Verify Dependency Injection of messageService

Ensure that the MessageService is properly registered and injected in the module to avoid runtime errors related to NestJS dependency injection.


151-155: Ensure Comprehensive Condition Coverage in Notification Logic

Verify that all relevant serviceStatus values and defender choices are accounted for in the conditional statement to prevent missing any notification scenarios.

…b.com:island-is/island.is into j-s/notifications-defendant-selected-defender
@oddsson oddsson requested a review from gudjong October 16, 2024 13:07
Copy link
Member

@gudjong gudjong left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One suggestion

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Outside diff range and nitpick comments (1)
apps/judicial-system/backend/src/app/modules/subpoena/subpoena.service.ts (1)

Line range hint 115-185: LGTM with suggestion: Update method enhanced with notification logic

The new logic for determining notificationType and sending notifications is well-implemented. However, consider the following suggestion:

The current implementation tolerates failures when sending notifications. While this prevents the update process from failing, it might lead to missed notifications. Consider implementing a retry mechanism or a more robust error handling strategy to ensure important notifications are not lost.

Example:

if (notificationType) {
  try {
    await this.messageService.sendMessagesToQueue([
      {
        type: MessageType.SUBPOENA_NOTIFICATION,
        body: {
          type: notificationType,
          subpoena,
        },
      },
    ]);
  } catch (error) {
    this.logger.error('Failed to dispatch notifications', { error });
    // Consider implementing a retry mechanism here
    // or storing failed notifications for later processing
  }
}
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between 01ca587 and 91959e9.

📒 Files selected for processing (4)
  • apps/judicial-system/backend/src/app/modules/notification/internalNotification.controller.ts (3 hunks)
  • apps/judicial-system/backend/src/app/modules/notification/subpoenaNotification.service.ts (1 hunks)
  • apps/judicial-system/backend/src/app/modules/subpoena/limitedAccessSubpoena.controller.ts (1 hunks)
  • apps/judicial-system/backend/src/app/modules/subpoena/subpoena.service.ts (5 hunks)
🚧 Files skipped from review as they are similar to previous changes (3)
  • apps/judicial-system/backend/src/app/modules/notification/internalNotification.controller.ts
  • apps/judicial-system/backend/src/app/modules/notification/subpoenaNotification.service.ts
  • apps/judicial-system/backend/src/app/modules/subpoena/limitedAccessSubpoena.controller.ts
🧰 Additional context used
📓 Path-based instructions (1)
apps/judicial-system/backend/src/app/modules/subpoena/subpoena.service.ts (1)

Pattern apps/**/*: "Confirm that the code adheres to the following:

  • NextJS best practices, including file structure, API routes, and static generation methods.
  • Efficient state management and server-side rendering techniques.
  • Optimal use of TypeScript for component and utility type safety."
📓 Learnings (2)
📓 Common learnings
Learnt from: oddsson
PR: island-is/island.is#16329
File: apps/judicial-system/backend/src/app/modules/notification/subpoenaNotification.service.ts:0-0
Timestamp: 2024-10-15T10:31:27.440Z
Learning: In `apps/judicial-system/backend/src/app/modules/subpoena/subpoena.service.ts`, the method `findBySubpoenaId` throws an error if the subpoena is not found. Therefore, downstream code does not need to check if the result is undefined.
Learnt from: oddsson
PR: island-is/island.is#16329
File: apps/judicial-system/backend/src/app/modules/notification/subpoenaNotification.service.ts:143-177
Timestamp: 2024-10-15T21:11:15.520Z
Learning: In `apps/judicial-system/backend/src/app/modules/notification/subpoenaNotification.service.ts`, the method `sendEmails` currently uses `Promise.all` for multiple recipients, and changing it to `Promise.allSettled` is considered for a future iteration.
apps/judicial-system/backend/src/app/modules/subpoena/subpoena.service.ts (1)
Learnt from: unakb
PR: island-is/island.is#16393
File: apps/judicial-system/digital-mailbox-api/src/app/modules/cases/models/subpoena.response.ts:164-169
Timestamp: 2024-10-14T21:34:16.234Z
Learning: Ensure that suggested code changes in `subpoena.response.ts` are accurate and necessary, avoiding redundant suggestions.
🔇 Additional comments (4)
apps/judicial-system/backend/src/app/modules/subpoena/subpoena.service.ts (4)

17-25: LGTM: New imports added for notification functionality

The new imports are correctly added and align with the changes made in the service. The use of TUser as a type alias for User is a good TypeScript practice.


62-62: LGTM: MessageService dependency added to constructor

The MessageService is correctly injected as a dependency in the constructor, which is necessary for the new notification functionality.


234-234: LGTM: User type updated in deliverSubpoenaToPolice method

The change from User to TUser for the user parameter type is consistent with the new imports and improves type consistency across the codebase.


Line range hint 1-286: LGTM: Overall changes consistent with coding guidelines

The modifications to the SubpoenaService adhere to NextJS best practices and make good use of TypeScript for type safety. The new notification functionality is well-integrated into the existing service structure.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Outside diff range and nitpick comments (1)
libs/judicial-system/types/src/lib/notification.ts (1)

26-29: LGTM: New type alias enhances type safety for subpoena notifications.

The introduction of subpoenaNotificationType is a good practice, grouping related notification types and potentially improving type safety in the codebase. It aligns well with TypeScript best practices.

For consistency with TypeScript naming conventions, consider capitalizing the first letter of the type alias:

export type SubpoenaNotificationType =
  | NotificationType.SERVICE_SUCCESSFUL
  | NotificationType.SERVICE_FAILED
  | NotificationType.DEFENDANT_SELECTED_DEFENDER

This change would align the type alias name with the common PascalCase convention for type names in TypeScript.

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between 91959e9 and 65203c4.

📒 Files selected for processing (4)
  • apps/judicial-system/backend/src/app/modules/notification/dto/subpoenaNotification.dto.ts (1 hunks)
  • apps/judicial-system/backend/src/app/modules/notification/subpoenaNotification.service.ts (1 hunks)
  • libs/judicial-system/types/src/index.ts (1 hunks)
  • libs/judicial-system/types/src/lib/notification.ts (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (3)
  • apps/judicial-system/backend/src/app/modules/notification/dto/subpoenaNotification.dto.ts
  • apps/judicial-system/backend/src/app/modules/notification/subpoenaNotification.service.ts
  • libs/judicial-system/types/src/index.ts
🧰 Additional context used
📓 Path-based instructions (1)
libs/judicial-system/types/src/lib/notification.ts (1)

Pattern libs/**/*: "Confirm that the code adheres to the following:

  • Reusability of components and hooks across different NextJS apps.
  • TypeScript usage for defining props and exporting types.
  • Effective tree-shaking and bundling practices."
📓 Learnings (1)
📓 Common learnings
Learnt from: oddsson
PR: island-is/island.is#16329
File: apps/judicial-system/backend/src/app/modules/notification/subpoenaNotification.service.ts:0-0
Timestamp: 2024-10-15T10:31:27.440Z
Learning: In `apps/judicial-system/backend/src/app/modules/subpoena/subpoena.service.ts`, the method `findBySubpoenaId` throws an error if the subpoena is not found. Therefore, downstream code does not need to check if the result is undefined.
Learnt from: oddsson
PR: island-is/island.is#16329
File: apps/judicial-system/backend/src/app/modules/notification/subpoenaNotification.service.ts:143-177
Timestamp: 2024-10-15T21:11:15.520Z
Learning: In `apps/judicial-system/backend/src/app/modules/notification/subpoenaNotification.service.ts`, the method `sendEmails` currently uses `Promise.all` for multiple recipients, and changing it to `Promise.allSettled` is considered for a future iteration.
🔇 Additional comments (2)
libs/judicial-system/types/src/lib/notification.ts (2)

21-23: LGTM: New notification types align with PR objectives.

The addition of SERVICE_SUCCESSFUL, SERVICE_FAILED, and DEFENDANT_SELECTED_DEFENDER to the NotificationType enum is consistent with the existing structure and naming conventions. These new types directly support the PR's objective of sending notifications for specific subpoena-related scenarios, enhancing communication for court users.


21-29: Adherence to coding guidelines for libs directory confirmed.

The changes in this file comply with the coding guidelines for the libs directory:

  1. The NotificationType enum and subpoenaNotificationType are reusable across different NextJS apps.
  2. TypeScript is correctly used for defining and exporting types.
  3. The simple nature of the enum and type alias should not interfere with effective tree-shaking and bundling practices.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between 65203c4 and c411118.

📒 Files selected for processing (3)
  • apps/judicial-system/backend/src/app/modules/notification/dto/subpoenaNotification.dto.ts (1 hunks)
  • apps/judicial-system/backend/src/app/modules/notification/subpoenaNotification.service.ts (1 hunks)
  • libs/judicial-system/types/src/index.ts (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • apps/judicial-system/backend/src/app/modules/notification/dto/subpoenaNotification.dto.ts
  • libs/judicial-system/types/src/index.ts
🧰 Additional context used
📓 Path-based instructions (1)
apps/judicial-system/backend/src/app/modules/notification/subpoenaNotification.service.ts (1)

Pattern apps/**/*: "Confirm that the code adheres to the following:

  • NextJS best practices, including file structure, API routes, and static generation methods.
  • Efficient state management and server-side rendering techniques.
  • Optimal use of TypeScript for component and utility type safety."
📓 Learnings (2)
📓 Common learnings
Learnt from: oddsson
PR: island-is/island.is#16329
File: apps/judicial-system/backend/src/app/modules/notification/subpoenaNotification.service.ts:0-0
Timestamp: 2024-10-15T10:31:27.440Z
Learning: In `apps/judicial-system/backend/src/app/modules/subpoena/subpoena.service.ts`, the method `findBySubpoenaId` throws an error if the subpoena is not found. Therefore, downstream code does not need to check if the result is undefined.
Learnt from: oddsson
PR: island-is/island.is#16329
File: apps/judicial-system/backend/src/app/modules/notification/subpoenaNotification.service.ts:143-177
Timestamp: 2024-10-15T21:11:15.520Z
Learning: In `apps/judicial-system/backend/src/app/modules/notification/subpoenaNotification.service.ts`, the method `sendEmails` currently uses `Promise.all` for multiple recipients, and changing it to `Promise.allSettled` is considered for a future iteration.
apps/judicial-system/backend/src/app/modules/notification/subpoenaNotification.service.ts (2)
Learnt from: oddsson
PR: island-is/island.is#16329
File: apps/judicial-system/backend/src/app/modules/notification/subpoenaNotification.service.ts:143-177
Timestamp: 2024-10-15T21:11:15.520Z
Learning: In `apps/judicial-system/backend/src/app/modules/notification/subpoenaNotification.service.ts`, the method `sendEmails` currently uses `Promise.all` for multiple recipients, and changing it to `Promise.allSettled` is considered for a future iteration.
Learnt from: oddsson
PR: island-is/island.is#16329
File: apps/judicial-system/backend/src/app/modules/notification/subpoenaNotification.service.ts:0-0
Timestamp: 2024-10-15T10:31:27.440Z
Learning: In `apps/judicial-system/backend/src/app/modules/subpoena/subpoena.service.ts`, the method `findBySubpoenaId` throws an error if the subpoena is not found. Therefore, downstream code does not need to check if the result is undefined.
🔇 Additional comments (4)
apps/judicial-system/backend/src/app/modules/notification/subpoenaNotification.service.ts (4)

31-51: LGTM: Class definition and constructor

The SubpoenaNotificationService class is well-structured, extending BaseNotificationService and using dependency injection appropriately. This design promotes code reuse and follows good practices for NestJS services.


53-76: LGTM: getEmailContents method

The getEmailContents method is well-implemented, providing appropriate email content based on the notification type. The use of a switch statement and error handling for unrecognized types are good practices.


143-177: LGTM: sendEmails method

The sendEmails method efficiently sends emails concurrently and handles cases where recipient information might be missing. The use of Promise.all is appropriate for the current implementation.


179-195: LGTM: sendNotification method

The sendNotification method is well-implemented, with proper error handling and a clear success/failure response. The asynchronous operation is correctly awaited, ensuring proper execution flow.

@oddsson oddsson added the automerge Merge this PR as soon as all checks pass label Oct 18, 2024
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Outside diff range and nitpick comments (2)
apps/judicial-system/backend/src/app/modules/subpoena/test/createTestingSubpoenaModule.ts (2)

31-31: LGTM: MessageService correctly mocked.

The MessageService is properly mocked for testing purposes. This is consistent with how other services are mocked in this file.

Consider grouping related mocks together. You could move this mock statement next to other judicial system related mocks for better organization.


13-13: Summary: MessageService integration enhances the testing module.

The changes introduce the MessageService to the testing module, including its import, mock, and addition to the providers array. These modifications are well-implemented and consistent with the existing code structure. They enhance the testing capabilities by making the MessageService available for dependency injection in tests.

As the project grows, consider creating a separate file for mock declarations to improve maintainability and reduce clutter in the main test module file.

Also applies to: 31-31, 80-80

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between dfa4abe and c26d006.

📒 Files selected for processing (2)
  • apps/judicial-system/backend/src/app/modules/subpoena/limitedAccessSubpoena.controller.ts (1 hunks)
  • apps/judicial-system/backend/src/app/modules/subpoena/test/createTestingSubpoenaModule.ts (3 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • apps/judicial-system/backend/src/app/modules/subpoena/limitedAccessSubpoena.controller.ts
🧰 Additional context used
📓 Path-based instructions (1)
apps/judicial-system/backend/src/app/modules/subpoena/test/createTestingSubpoenaModule.ts (1)

Pattern apps/**/*: "Confirm that the code adheres to the following:

  • NextJS best practices, including file structure, API routes, and static generation methods.
  • Efficient state management and server-side rendering techniques.
  • Optimal use of TypeScript for component and utility type safety."
📓 Learnings (1)
📓 Common learnings
Learnt from: oddsson
PR: island-is/island.is#16329
File: apps/judicial-system/backend/src/app/modules/notification/subpoenaNotification.service.ts:0-0
Timestamp: 2024-10-15T10:31:27.440Z
Learning: In `apps/judicial-system/backend/src/app/modules/subpoena/subpoena.service.ts`, the method `findBySubpoenaId` throws an error if the subpoena is not found. Therefore, downstream code does not need to check if the result is undefined.
🔇 Additional comments (2)
apps/judicial-system/backend/src/app/modules/subpoena/test/createTestingSubpoenaModule.ts (2)

13-13: LGTM: MessageService import added correctly.

The import statement for MessageService is properly placed and follows the correct syntax and naming conventions for TypeScript and the project structure.


80-80: LGTM: MessageService added to providers.

The MessageService is correctly added to the providers array, making it available for dependency injection in the test module. This is consistent with how other services are provided in this module.

@oddsson oddsson added automerge Merge this PR as soon as all checks pass and removed automerge Merge this PR as soon as all checks pass labels Oct 18, 2024
@kodiakhq kodiakhq bot merged commit 75ba90b into main Oct 18, 2024
56 checks passed
@kodiakhq kodiakhq bot deleted the j-s/notifications-defendant-selected-defender branch October 18, 2024 18:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
automerge Merge this PR as soon as all checks pass
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants